#region Usings

using System;
using System.IO;
using NUnit.Framework;
using Karma.Framework.Core.Domain.Tools.Import.Layout;
using Karma.Framework.Core.Test.Domain.Tools.Importador.Entidades;

#endregion

namespace Karma.Framework.Core.Test.Domain.Tools.Importador
{
    [TestFixture]
    public class LectorArchivoLayoutFixture
    {
        [Test]
        public void LeeArchivoEntidadConAgregadoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout =
                factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig {GenerateAggregates = true},
                                                              new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(data);
            Assert.IsNotNull(data.Data);

            Assert.AreEqual(5, data.Data.Count);

            Assert.IsNotNull(data.Data[0].Data);
            Assert.AreEqual(4, data.Data[0].Data.Count);

            Assert.IsNotNull(data.Data[0].Data[0]);
            Assert.AreEqual("aaaa", data.Data[0].Data[0].Value);
            Assert.AreEqual("1", data.Data[0].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[0].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[0].Data[3].Value);

            Assert.IsNotNull(data.Data[1].Data[0]);
            Assert.AreEqual("bbbb", data.Data[1].Data[0].Value);
            Assert.AreEqual("2", data.Data[1].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[1].Data[2].Value) - 1));
            Assert.AreEqual("2", data.Data[1].Data[3].Value);

            Assert.IsNotNull(data.Data[2].Data[0]);
            Assert.AreEqual("cccc", data.Data[2].Data[0].Value);
            Assert.AreEqual("3", data.Data[2].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[2].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[2].Data[3].Value);

            Assert.IsNotNull(data.Data[3].Data[0]);
            Assert.AreEqual("dddd", data.Data[3].Data[0].Value);
            Assert.AreEqual("4", data.Data[3].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[3].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[3].Data[3].Value);

            Assert.IsNotNull(data.Data[4].Data[0]);
            Assert.AreEqual("eeee", data.Data[4].Data[0].Value);
            Assert.AreEqual("5", data.Data[4].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[4].Data[2].Value) - 1));
            Assert.AreEqual("2", data.Data[4].Data[3].Value);

            // agregados
            Assert.IsNotNull(data.Aggregates);
            Assert.AreEqual(1, data.Aggregates.Count);

            var datosAgregado = data.Aggregates[0];
            Assert.IsNotNull(datosAgregado.Data);
            Assert.AreEqual(5, datosAgregado.Data.Count);

            Assert.IsNotNull(datosAgregado.Data[0].Data[0]);
            Assert.AreEqual("aaaa", datosAgregado.Data[0].Data[0].Value);
            Assert.AreEqual("1", datosAgregado.Data[0].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) datosAgregado.Data[0].Data[2].Value) -
                                                               1));

            Assert.IsNotNull(datosAgregado.Data[1].Data[0]);
            Assert.AreEqual("bbbb", datosAgregado.Data[1].Data[0].Value);
            Assert.AreEqual("2", datosAgregado.Data[1].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) datosAgregado.Data[1].Data[2].Value) -
                                                               1));

            Assert.IsNotNull(datosAgregado.Data[2].Data[0]);
            Assert.AreEqual("cccc", datosAgregado.Data[2].Data[0].Value);
            Assert.AreEqual("3", datosAgregado.Data[2].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) datosAgregado.Data[2].Data[2].Value) -
                                                               1));

            Assert.IsNotNull(datosAgregado.Data[3].Data[0]);
            Assert.AreEqual("dddd", datosAgregado.Data[3].Data[0].Value);
            Assert.AreEqual("4", datosAgregado.Data[3].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) datosAgregado.Data[3].Data[2].Value) -
                                                               1));

            Assert.IsNotNull(datosAgregado.Data[4].Data[0]);
            Assert.AreEqual("eeee", datosAgregado.Data[4].Data[0].Value);
            Assert.AreEqual("5", datosAgregado.Data[4].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) datosAgregado.Data[4].Data[2].Value) -
                                                               1));
        }

        [Test]
        public void LeeArchivoEntidadConAsociadoConIdRefTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(data);
            Assert.IsNotNull(data.Data);

            //Assert.AreEqual(5, data.Data.Count);
            Assert.AreEqual(0, data.Aggregates.Count);

            Assert.IsNotNull(data.Data[0].Data);
            Assert.AreEqual(4, data.Data[0].Data.Count);

            Assert.IsNotNull(data.Data[0].Data[0]);
            Assert.AreEqual("aaaa", data.Data[0].Data[0].Value);
            Assert.AreEqual("1", data.Data[0].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[0].Data[2].Value) - 1));
            Assert.AreEqual("aaaa", data.Data[0].Data[3].Value);

            Assert.IsNotNull(data.Data[1].Data[0]);
            Assert.AreEqual("bbbb", data.Data[1].Data[0].Value);
            Assert.AreEqual("2", data.Data[1].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[1].Data[2].Value) - 1));
            Assert.AreEqual("bbbb", data.Data[1].Data[3].Value);

            Assert.IsNotNull(data.Data[2].Data[0]);
            Assert.AreEqual("cccc", data.Data[2].Data[0].Value);
            Assert.AreEqual("3", data.Data[2].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[2].Data[2].Value) - 1));
            Assert.AreEqual("aaaa", data.Data[2].Data[3].Value);

            Assert.IsNotNull(data.Data[3].Data[0]);
            Assert.AreEqual("dddd", data.Data[3].Data[0].Value);
            Assert.AreEqual("4", data.Data[3].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[3].Data[2].Value) - 1));
            Assert.AreEqual("aaaa", data.Data[3].Data[3].Value);

            Assert.IsNotNull(data.Data[4].Data[0]);
            Assert.AreEqual("eeee", data.Data[4].Data[0].Value);
            Assert.AreEqual("5", data.Data[4].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[4].Data[2].Value) - 1));
            Assert.AreEqual("bbbb", data.Data[4].Data[3].Value);
        }

        [Test]
        public void LeeArchivoEntidadConAsociadoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(data);
            Assert.IsNotNull(data.Data);

            Assert.AreEqual(12000, data.Data.Count);
            Assert.AreEqual(0, data.Aggregates.Count);

            Assert.IsNotNull(data.Data[0].Data);
            Assert.AreEqual(4, data.Data[0].Data.Count);

            Assert.IsNotNull(data.Data[0].Data[0]);
            Assert.AreEqual("aaaa", data.Data[0].Data[0].Value);
            Assert.AreEqual("1", data.Data[0].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[0].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[0].Data[3].Value);

            Assert.IsNotNull(data.Data[1].Data[0]);
            Assert.AreEqual("bbbb", data.Data[1].Data[0].Value);
            Assert.AreEqual("2", data.Data[1].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[1].Data[2].Value) - 1));
            Assert.AreEqual("2", data.Data[1].Data[3].Value);

            Assert.IsNotNull(data.Data[2].Data[0]);
            Assert.AreEqual("cccc", data.Data[2].Data[0].Value);
            Assert.AreEqual("3", data.Data[2].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[2].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[2].Data[3].Value);

            Assert.IsNotNull(data.Data[3].Data[0]);
            Assert.AreEqual("dddd", data.Data[3].Data[0].Value);
            Assert.AreEqual("4", data.Data[3].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[3].Data[2].Value) - 1));
            Assert.AreEqual("1", data.Data[3].Data[3].Value);

            Assert.IsNotNull(data.Data[4].Data[0]);
            Assert.AreEqual("eeee", data.Data[4].Data[0].Value);
            Assert.AreEqual("5", data.Data[4].Data[1].Value);
            Assert.AreEqual(DateTime.Parse("12/05/2009"),
                            new DateTime(1899, 12, 31).AddDays(int.Parse((string) data.Data[4].Data[2].Value) - 1));
            Assert.AreEqual("2", data.Data[4].Data[3].Value);
        }

        [Test]
        public void LeeArchivoEntidadSimpleFechaIncorrectaTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "FechaIncorrecta.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(data);
            Assert.IsNotNull(data.Data);

            Assert.AreEqual(5, data.Data.Count);
            Assert.AreEqual(0, data.Aggregates.Count);

            Assert.IsNotNull(data.Data[0].Data);
            Assert.AreEqual(3, data.Data[0].Data.Count);

            Assert.IsNotNull(data.Data[0].Data[0]);
            Assert.AreEqual("aaaa", data.Data[0].Data[0].Value);
            Assert.AreEqual("1", data.Data[0].Data[1].Value);
            Assert.AreEqual("40/05/2009", data.Data[0].Data[2].Value);
        }

        [Test]
        public void LeeArchivoEntidadSimpleTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(data);
            Assert.IsNotNull(data.Data);

            Assert.AreEqual(5, data.Data.Count);
            Assert.AreEqual(0, data.Aggregates.Count);

            Assert.IsNotNull(data.Data[0].Data);
            Assert.AreEqual(3, data.Data[0].Data.Count);

            Assert.IsNotNull(data.Data[0].Data[0]);
            Assert.AreEqual("aaaa", data.Data[0].Data[0].Value);
            Assert.AreEqual("1", data.Data[0].Data[1].Value);
            Assert.AreEqual("39945", data.Data[0].Data[2].Value);

            Assert.IsNotNull(data.Data[1].Data[0]);
            Assert.AreEqual("bbbb", data.Data[1].Data[0].Value);
            Assert.AreEqual("2", data.Data[1].Data[1].Value);
            Assert.AreEqual("39945", data.Data[1].Data[2].Value);

            Assert.IsNotNull(data.Data[2].Data[0]);
            Assert.AreEqual("cccc", data.Data[2].Data[0].Value);
            Assert.AreEqual("3", data.Data[2].Data[1].Value);
            Assert.AreEqual("39945", data.Data[2].Data[2].Value);

            Assert.IsNotNull(data.Data[3].Data[0]);
            Assert.AreEqual("dddd", data.Data[3].Data[0].Value);
            Assert.AreEqual("4", data.Data[3].Data[1].Value);
            Assert.AreEqual("39945", data.Data[3].Data[2].Value);

            Assert.IsNotNull(data.Data[4].Data[0]);
            Assert.AreEqual("1", data.Data[4].PrimaryKey.Value);
            Assert.AreEqual("eeee", data.Data[4].Data[0].Value);
            Assert.AreEqual("5", data.Data[4].Data[1].Value);
            Assert.AreEqual("39945", data.Data[4].Data[2].Value);
        }
    }
}